
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>13、LinkedList双向链表的Java实现 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>13、LinkedList双向链表的Java实现 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">除了List接口，LinkedList还实现了一个重要的接口是什么？这个接口赋予了它什么关键能力？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">LinkedList实现了Deque接口，这意味着它不仅是一个列表，还是一个双端队列。这使得它可以在两端高效地添加和删除元素，因此常被用作栈或队列。</div>
          </div>
          <div class="card-source">来源: 1.1 类继承关系</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">LinkedList的`first`, `last`, 和 `size` 核心成员变量为何被声明为`transient`？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">这些变量被声明为`transient`是因为它们在序列化时会被忽略。LinkedList实现了自己的序列化方法，该方法只序列化元素内容，而不是内部的链接结构，从而避免了序列化整个节点对象。</div>
          </div>
          <div class="card-source">来源: 1.2 核心成员变量</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">结构</div>
          <div class="card-question">构成LinkedList基础的内部`Node`类包含哪三个核心属性？它们共同构成了什么样的数据结构？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">结构</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">内部`Node`类包含三个核心属性：`item`用于存储实际元素，`next`指向后继节点，`prev`指向前驱节点。它们共同构成了一个典型的双向链表节点结构。</div>
          </div>
          <div class="card-source">来源: 1.3 Node内部类结构</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">性能</div>
          <div class="card-question">在通过索引查找元素时（如get(index)方法），LinkedList内部采用了什么优化策略来提高效率？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">性能</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">LinkedList会根据索引位置来决定遍历方向。如果索引小于列表大小的一半（`index < (size >> 1)`），它会从`first`节点开始向后遍历；否则，它会从`last`节点开始向前遍历。这能将最坏情况下的遍历次数从N减少到N/2。</div>
          </div>
          <div class="card-source">来源: 3.3 查找元素操作</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">为什么说“LinkedList在任意位置插入删除快”这一说法具有误导性？以`add(int index, E element)`方法为例说明。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">虽然在找到目标位置后，修改指针以插入节点的操作本身是O(1)的，但`add(int index, E element)`方法首先需要通过遍历找到第`index`个节点，这个查找过程的时间复杂度是O(n)。因此，整个按索引插入操作的总体时间复杂度是O(n)，而非O(1)。</div>
          </div>
          <div class="card-source">来源: 3.1 添加元素操作</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">为什么使用ListIterator在遍历LinkedList时进行添加或删除操作是高效的（O(1)）？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">因为ListIterator在遍历过程中已经维护了当前位置的节点引用（`next`和`lastReturned`）。当调用`add()`或`remove()`时，它可以直接利用这些引用来修改链表结构，无需再进行一次从头或尾开始的查找，所以操作时间复杂度为O(1)。</div>
          </div>
          <div class="card-source">来源: 3.4 迭代器实现</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">性能</div>
          <div class="card-question">在哪个核心性能指标上，LinkedList的表现是其主要短板，远不如ArrayList？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">性能</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">LinkedList的主要短板在于随机访问性能。与ArrayList的O(1)直接索引访问相比，LinkedList的`get(int index)`操作需要O(n)的时间来从头或尾遍历链表以找到指定位置的元素，因此在需要频繁随机访问的场景中性能表现非常差。</div>
          </div>
          <div class="card-source">来源: 4.1 随机访问性能</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">在从LinkedList中移除一个非首尾节点时，`unlink(Node<E> x)`方法是如何重新连接链表的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`unlink`方法通过修改待删除节点`x`的前驱节点`prev`和后继节点`next`的指针来重新连接链表。它将`prev`的`next`指针指向`next`节点，同时将`next`的`prev`指针指向`prev`节点，从而将节点`x`从链表中“旁路”掉。</div>
          </div>
          <div class="card-source">来源: 3.2 删除元素操作</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">从内存占用的角度分析，LinkedList与ArrayList相比有何特点？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在存储相同数量的元素时，LinkedList通常需要比ArrayList更多的内存。这是因为每个元素都被包装在一个`Node`对象中，该对象除了存储元素引用外，还包含了`next`和`prev`两个额外的指针引用以及对象头开销。此外，其节点在内存中非连续分布，可能导致缓存局部性较差。</div>
          </div>
          <div class="card-source">来源: 4.3 内存占用分析</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
